const crypto = require('crypto');

/**
 * 生成随机邀请码
 * @param {number} length 邀请码长度，默认8位
 * @returns {string} 邀请码
 */
function generateInviteCode(length = 8) {
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  let result = '';
  
  for (let i = 0; i < length; i++) {
    const randomIndex = crypto.randomInt(0, chars.length);
    result += chars[randomIndex];
  }
  
  return result;
}

/**
 * 生成更安全的邀请码（使用时间戳+随机数）
 * @param {number} length 邀请码长度，默认10位
 * @param {string} type 邀请码类型，用于区分不同用途
 * @returns {string} 邀请码
 */
function generateSecureInviteCode(length = 10, type = 'INVITE') {
  // 使用更长的长度提高安全性
  const timestamp = Date.now().toString(36).toUpperCase();
  const random = crypto.randomBytes(6).toString('hex').toUpperCase();
  const typePrefix = type.substring(0, 2).toUpperCase();
  
  // 组合：类型前缀(2) + 时间戳(6-8) + 随机数(12)
  let combined = typePrefix + timestamp + random;
  
  // 如果长度不够，用随机字符填充
  if (combined.length < length) {
    const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    const needed = length - combined.length;
    for (let i = 0; i < needed; i++) {
      const randomIndex = crypto.randomInt(0, chars.length);
      combined += chars[randomIndex];
    }
  }
  
  return combined.substring(0, length);
}

/**
 * 生成批量邀请码
 * @param {number} count 生成数量
 * @param {number} length 邀请码长度
 * @param {string} type 邀请码类型
 * @returns {string[]} 邀请码数组
 */
function generateBatchInviteCodes(count = 1, length = 10, type = 'INVITE') {
  const codes = [];
  const usedCodes = new Set();
  
  for (let i = 0; i < count; i++) {
    let code;
    let attempts = 0;
    const maxAttempts = 100; // 防止无限循环
    
    do {
      code = generateSecureInviteCode(length, type);
      attempts++;
    } while (usedCodes.has(code) && attempts < maxAttempts);
    
    if (attempts >= maxAttempts) {
      throw new Error('生成唯一邀请码失败，请重试');
    }
    
    usedCodes.add(code);
    codes.push(code);
  }
  
  return codes;
}

/**
 * 验证邀请码格式
 * @param {string} code 邀请码
 * @param {number} minLength 最小长度
 * @param {number} maxLength 最大长度
 * @returns {boolean} 是否有效
 */
function validateInviteCodeFormat(code, minLength = 6, maxLength = 20) {
  if (!code || typeof code !== 'string') {
    return false;
  }
  
  // 检查长度
  if (code.length < minLength || code.length > maxLength) {
    return false;
  }
  
  // 检查字符（只允许大写字母和数字）
  const validChars = /^[A-Z0-9]+$/;
  return validChars.test(code);
}

/**
 * 从邀请码中提取信息
 * @param {string} code 邀请码
 * @returns {object} 邀请码信息
 */
function parseInviteCode(code) {
  if (!validateInviteCodeFormat(code)) {
    return null;
  }
  
  try {
    // 提取类型前缀（前2位）
    const type = code.substring(0, 2);
    
    // 提取时间戳（第3-10位，如果存在）
    const timestampPart = code.substring(2, 10);
    let timestamp = null;
    
    try {
      // 尝试解析时间戳
      const timestampNum = parseInt(timestampPart, 36);
      if (!isNaN(timestampNum) && timestampNum > 0) {
        timestamp = new Date(timestampNum);
      }
    } catch (e) {
      // 忽略时间戳解析错误
    }
    
    return {
      type,
      timestamp,
      isValid: true
    };
  } catch (error) {
    return {
      type: 'UNKNOWN',
      timestamp: null,
      isValid: false
    };
  }
}

module.exports = {
  generateInviteCode,
  generateSecureInviteCode,
  generateBatchInviteCodes,
  validateInviteCodeFormat,
  parseInviteCode
};

